MySQL有儲存引擎的概念,使用者可以依照自己的需求,選擇使用不同的儲存引擎來提高應用的效率,我們可以透過MySQL輸入以下指令,就可以看出目前支援了哪些引擎,以及預設的儲存引擎。
mysql > show engines;
接下來我們就來了解一下常用的儲存引擎吧!
MyISAM不支援事務與外鍵,但連接的速度快,適合不需要事務或者是以select & insert為主的表應用。
每一個以MyISAM建立的表,在硬碟中都會儲存三個檔案,檔案的名稱都會與表名一樣,三個檔案分別是:
[table_name]_數字.frm:儲存表的詳細訊息
[table_name].myd:資料檔
[table_name].myi:索引檔
InnoDB有commit、rollback事務功能,但與MyISAM相比,寫入的效率稍差,會占用到較多的硬碟空間,除了上述,比較特別的是MySQL中只有Innodb有foreign(外鍵)的功能。
Innodb的資料與索引都是存在同一個檔案,但儲存方式有兩種,可以透過innodb_file_per_table參數調整,決定要儲存在共同表的空間(ibdata),或是將每個表分開。
若開啟innodb_file_per_table參數,每個表則會有一個[table_name].ibd的檔案。
外鍵可以指向其他表的主鍵,限制欄位值只能來自另一個表的主鍵欄位,用來確定資料完整性。
以下我們來簡單示範看看,外鍵的用法吧!
產品資料表product
item | price |
---|---|
apple | 20 |
orange | 15 |
pineapple | 50 |
客戶訂單form
Customer | item | count |
---|---|---|
我們要限制的是item(品項),因為除了這三樣水果,我們也沒有賣其他的了,如果可以下訂單就太奇怪了。
建立product table
若要限制item,item就必須要是primary key
mysql> create table product(item varchar(20), price int ,primary key(item));
建立form table
mysql> create table form (customer varchar(20),item varchar(20),count int,foreign key(item) references product(item));
這樣的話在form表格中,就無法新增除了apple、orange、pineaplle這三項的水果了。
Memory建立表時是直接儲存在記憶體中,在連接表時非常快
,每個表只會實際對應一個磁碟檔.sdi,但只要服務一關閉,資料將會全遺失。
今天先介紹幾個較常用的engine,但說了那麼多都還沒分享要怎麼設定engine,
以下指令就是在建立表時設定engine的方式。
mysql> create table t1 (id int)engine=[myisam;innodb;memory];
如果要查看表的engine可以輸入
mysql> show create table [table_name];
參考資料: https://www.fooish.com/sql/foreign-key-constraint.html